<template>
  <div v-if="visible" class="sound-mask" @mousedown.self="close">
    <div class="sound-panel" @mousedown.stop>
      <div class="sound-title">{{ $t('components.sound.title') }}</div>
             <div class="sound-slider-row">
         <input type="range" min="0" max="100" v-model="volume" @input="setVolume" class="sound-slider" />
         <span class="sound-value" :class="{ 'setting': isSettingVolume }">{{ volume }}</span>
       </div>
      <div class="sound-info-row">
  
      </div>

    </div>
  </div>
</template>

<script setup lang="ts">
import { defineExpose, onMounted, ref } from 'vue'

// 使用备用翻译系统
let t = (key: any) => key
let setLang = (newLang: any) => {}

// 创建响应式的翻译函数
const translationVersion = ref(0)
const $t = (key: any) => {
  // 依赖translationVersion来触发响应式更新
  translationVersion.value
  return t(key)
}

// 初始化翻译函数
const initTranslations = async () => {
  try {
    const fallback = await import('../utils/i18n-fallback')
    t = fallback.t
    setLang = (newLang: any) => {
      fallback.setLang(newLang)
      translationVersion.value++
    }
    // 监听语言变化事件
    window.addEventListener('language-changed', () => {
      translationVersion.value++
    })
  } catch (error) {
    console.warn('Failed to load i18n fallback:', error)
  }
}

const volume = ref(50)
const visible = ref(false)
const isSettingVolume = ref(false)

function open() {
	visible.value = true
  getSystemVolume()
  // 测试IPC通信
  testIPCommunication()
}
function close() {
  visible.value = false
}

async function getSystemVolume() {
  try {
    console.log('开始获取系统音量...')
    
    if (!window.electron?.ipcRenderer) {
      console.warn('Electron环境不可用，使用默认音量')
      volume.value = 50
      return
    }
    
    console.log('调用Electron IPC获取音量...')
    const systemVolume = await window.electron.ipcRenderer.invoke('get-volume')
    console.log('获取到的系统音量:', systemVolume)
    
    // 确保音量值在有效范围内
    const validVolume = Math.max(0, Math.min(100, systemVolume || 50))
    volume.value = validVolume
    console.log('设置组件音量为:', validVolume)
  } catch (e: any) {
    console.error('获取系统音量失败:', e)
    const getErrorMsg = e?.message || e?.toString() || ''
    const getErrorCode = e?.code || ''
    
    console.log('获取音量错误详情:', {
      message: getErrorMsg,
      code: getErrorCode,
      name: e?.name
    })
    
    // 使用默认音量
    volume.value = 50
    
    // 分析获取音量失败的原因
    let getSolution = '使用默认音量值'
    if (getErrorMsg.includes('permission') || getErrorMsg.includes('access') || getErrorCode === 'EACCES') {
      getSolution = '权限不足，建议以管理员身份运行'
    } else if (getErrorMsg.includes('AUDCLNT') || getErrorMsg.includes('audio device')) {
      getSolution = '音频设备异常，请检查音频驱动'
    } else if (getErrorMsg.includes('COM') || getErrorMsg.includes('CoInitialize')) {
      getSolution = 'COM组件异常，请重启应用'
    } else if (getErrorMsg.includes('service') || getErrorMsg.includes('RPC')) {
      getSolution = '音频服务不可用，请重启Windows Audio服务'
    }
    
    // 显示详细错误提示
    const getDetailedMessage = `获取系统音量失败：${getSolution}\n\n技术详情：${getErrorMsg.slice(0, 80)}${getErrorCode ? ` (${getErrorCode})` : ''}`
    window.messageRef?.show(getDetailedMessage, 'error')
  }
}
// 防抖定时器
let volumeDebounceTimer: NodeJS.Timeout | null = null

async function setVolume() {
  try {
    // 确保音量值在有效范围内
    const volumeValue = Math.max(0, Math.min(100, volume.value))
    console.log('准备设置音量:', volumeValue)
    
    // 清除之前的定时器
    if (volumeDebounceTimer) {
      clearTimeout(volumeDebounceTimer)
    }
    
    // 设置防抖，避免频繁调用
    volumeDebounceTimer = setTimeout(async () => {
      isSettingVolume.value = true
      
      try {
        // 检查Electron环境
        if (!window.electron?.ipcRenderer) {
          console.warn('Electron环境不可用，无法设置系统音量')
          window.messageRef?.show('音量控制功能仅在桌面应用中可用', 'warning')
          return
        }
        
        console.log('调用Electron IPC设置音量:', volumeValue)
        
        // 首先尝试获取当前音量以测试权限
        try {
          await window.electron.ipcRenderer.invoke('get-volume')
        } catch (permError: any) {
          console.error('权限检查失败:', permError)
          const permErrorMsg = permError?.message || permError?.toString() || ''
          const permErrorCode = permError?.code || ''
          
          console.log('权限错误详情:', {
            message: permErrorMsg,
            code: permErrorCode,
            name: permError?.name
          })
          
          // 分析权限错误原因并提供详细解决方案
          let permSolution = '请以管理员身份运行应用'
          let detailedSolutions = [
            '🔧 详细解决方案:',
            '1. 右键点击应用图标，选择"以管理员身份运行"',
            '2. 检查Windows Audio服务是否运行:',
            '   - 按Win+R，输入services.msc',
            '   - 找到"Windows Audio"服务，确保状态为"正在运行"',
            '3. 如果音频设备被其他程序占用，请关闭相关程序',
            '4. 重新插拔音频设备或重启音频驱动',
            '5. 更新音频驱动程序',
            '6. 重启应用或系统',
            '7. 检查Windows系统是否已激活:',
            '   - 按Win+I打开设置',
            '   - 进入"更新和安全" > "激活"',
            '   - 确保Windows已激活，未激活可能影响系统功能'
          ]
          
          if (permErrorMsg.includes('AUDCLNT') || permErrorMsg.includes('audio device')) {
            permSolution = '音频设备被其他程序占用或驱动异常，请重启音频服务'
            detailedSolutions[2] = '2. 音频设备异常，请检查音频驱动或重新插拔音频设备'
          } else if (permErrorMsg.includes('COM') || permErrorMsg.includes('CoInitialize')) {
            permSolution = 'COM组件初始化失败，请重启应用'
            detailedSolutions[2] = '2. COM组件异常，请重启应用'
          } else if (permErrorCode === 'EACCES' || permErrorMsg.includes('access denied')) {
            permSolution = '系统拒绝访问，请右键以管理员身份运行'
          }
          
          // 检查是否可能是Windows激活问题
          if (permErrorMsg.includes('activation') || permErrorMsg.includes('license') || permErrorMsg.includes('unlicensed')) {
            detailedSolutions[6] = '6. ⚠️ Windows系统未激活可能影响系统功能，建议激活系统'
          }
          
          const permDetailedMessage = `音量控制权限检查失败：${permSolution}\n\n${detailedSolutions.join('\n')}\n\n技术详情：${permErrorMsg.slice(0, 80)}${permErrorCode ? ` (${permErrorCode})` : ''}`
          window.messageRef?.show(permDetailedMessage, 'error')
          return
        }
        
        const result = await window.electron.ipcRenderer.invoke('set-volume', volumeValue)
        console.log('音量设置结果:', result)
        
        if (result === true) {
          console.log('✅ 系统音量设置成功:', volumeValue)
          // 验证设置是否生效
          setTimeout(async () => {
            try {
              const currentVol = await window.electron?.ipcRenderer?.invoke('get-volume')
              if (Math.abs(currentVol - volumeValue) > 5) {
                console.warn('音量设置可能未完全生效')
                window.messageRef?.show('音量设置完成，但可能需要手动验证', 'warning')
              }
            } catch (e) {
              console.warn('无法验证音量设置结果')
            }
          }, 300)
        } else if (result === false) {
          console.error('❌ 音量设置被系统拒绝')
          
          // 提供详细的解决方案
          const solutions = [
            '🔧 解决方案:',
            '1. 右键点击应用图标，选择"以管理员身份运行"',
            '2. 检查Windows Audio服务是否运行:',
            '   - 按Win+R，输入services.msc',
            '   - 找到"Windows Audio"服务，确保状态为"正在运行"',
            '3. 如果音频设备被其他程序占用，请关闭相关程序',
            '4. 重新插拔音频设备或重启音频驱动',
            '5. 更新音频驱动程序',
            '6. 重启应用或系统',
            '7. 检查Windows系统是否已激活:',
            '   - 按Win+I打开设置',
            '   - 进入"更新和安全" > "激活"',
            '   - 确保Windows已激活，未激活可能影响系统功能'
          ]
          
          window.messageRef?.show(solutions.join('\n'), 'error')
        } else {
          console.error('❌ 音量设置返回未知结果:', result)
          window.messageRef?.show('音量设置失败，系统返回异常', 'error')
        }
      } catch (e: any) {
        console.error('设置系统音量失败:', e)
        
        // 获取详细错误信息
        const errorMsg = e?.message || e?.toString() || ''
        const errorCode = e?.code || ''
        const errorName = e?.name || ''
        
        console.log('错误详情:', {
          message: errorMsg,
          code: errorCode,
          name: errorName,
          stack: e?.stack
        })
        
        // 构建详细错误提示和解决方案
        let userMessage = '音量设置失败'
        let solution = ''
        let detailedSolutions = [
          '🔧 详细解决方案:',
          '1. 右键点击应用图标，选择"以管理员身份运行"',
          '2. 检查Windows Audio服务是否运行:',
          '   - 按Win+R，输入services.msc',
          '   - 找到"Windows Audio"服务，确保状态为"正在运行"',
          '3. 如果音频设备被其他程序占用，请关闭相关程序',
          '4. 重新插拔音频设备或重启音频驱动',
          '5. 更新音频驱动程序',
          '6. 重启应用或系统',
          '7. 检查Windows系统是否已激活:',
          '   - 按Win+I打开设置',
          '   - 进入"更新和安全" > "激活"',
          '   - 确保Windows已激活，未激活可能影响系统功能'
        ]
        
        if (errorMsg.includes('permission') || errorMsg.includes('access') || errorMsg.includes('denied') || errorCode === 'EACCES') {
          solution = '需要管理员权限，请右键以管理员身份运行应用'
        } else if (errorMsg.includes('device') || errorMsg.includes('audio') || errorMsg.includes('AUDCLNT')) {
          solution = '音频设备异常，请检查音频驱动或重新插拔音频设备'
          detailedSolutions[2] = '2. 音频设备异常，请检查音频驱动或重新插拔音频设备'
        } else if (errorMsg.includes('timeout') || errorCode === 'ETIMEDOUT') {
          solution = '操作超时，请稍后重试'
          detailedSolutions[2] = '2. 操作超时，请稍后重试'
        } else if (errorMsg.includes('service') || errorMsg.includes('RPC') || errorMsg.includes('server')) {
          solution = '音频服务不可用，请重启Windows Audio服务'
          detailedSolutions[2] = '2. 音频服务不可用，请重启Windows Audio服务'
        } else if (errorMsg.includes('COM') || errorMsg.includes('CoInitialize')) {
          solution = 'COM组件初始化失败，请重启应用'
          detailedSolutions[2] = '2. COM组件异常，请重启应用'
        } else if (errorMsg.includes('HRESULT')) {
          const hresult = errorMsg.match(/HRESULT.*?(?:\s|$)/)?.[0] || ''
          solution = `系统API调用失败 ${hresult}，请检查系统音频配置`
          detailedSolutions[2] = '2. 系统API调用失败，请检查系统音频配置'
        } else {
          solution = '未知错误，请重启应用或联系技术支持'
        }
        
        // 检查是否可能是Windows激活问题
        if (errorMsg.includes('activation') || errorMsg.includes('license') || errorMsg.includes('unlicensed')) {
          detailedSolutions[6] = '6. ⚠️ Windows系统未激活可能影响系统功能，建议激活系统'
        }
        
        // 显示详细错误信息
        const detailedMessage = `${userMessage}：${solution}\n\n${detailedSolutions.join('\n')}\n\n技术详情：${errorMsg.slice(0, 100)}${errorCode ? ` (${errorCode})` : ''}`
        window.messageRef?.show(detailedMessage, 'error')
      } finally {
        isSettingVolume.value = false
      }
    }, 50) // 50ms防抖，更快的响应
  } catch (e) {
    console.error('音量设置错误:', e)
    isSettingVolume.value = false
  }
}

// 测试IPC通信
async function testIPCommunication() {
  try {
    console.log('=== 测试IPC通信 ===')
    console.log('window.electron:', window.electron)
    console.log('window.electron?.ipcRenderer:', window.electron?.ipcRenderer)
    
    if (window.electron?.ipcRenderer) {
      console.log('尝试调用get-volume...')
      const testResult = await window.electron.ipcRenderer.invoke('get-volume')
      console.log('get-volume测试结果:', testResult)
    } else {
      console.log('Electron IPC不可用')
    }
  } catch (error) {
    console.error('IPC通信测试失败:', error)
  }
}

// 测试音量控制
async function testVolume() {
  try {
    console.log('=== 测试音量控制 ===')
    const testVolume = 80
    console.log('设置测试音量为:', testVolume)
    
    if (window.electron?.ipcRenderer) {
      const result = await window.electron.ipcRenderer.invoke('set-volume', testVolume)
      console.log('音量设置测试结果:', result)
      
      // 等待一秒后获取音量
      setTimeout(async () => {
        const currentVolume = await window.electron?.ipcRenderer?.invoke('get-volume')
        console.log('当前系统音量:', currentVolume)
      }, 1000)
    } else {
      console.log('Electron IPC不可用')
    }
  } catch (error) {
    console.error('音量控制测试失败:', error)
  }
}

// 完整系统诊断
async function diagnoseFull() {
  try {
    console.log('=== 开始系统音频诊断 ===')
    let diagnosticInfo = ['🔊 音频系统诊断报告', '']
    
    // 1. 检查Electron环境
    const hasElectron = !!window.electron?.ipcRenderer
    diagnosticInfo.push(`✅ Electron环境: ${hasElectron ? '可用' : '❌ 不可用'}`)
    
    if (!hasElectron) {
      diagnosticInfo.push('', '❌ 无法进行进一步诊断，请在桌面应用中运行')
      window.messageRef?.show(diagnosticInfo.join('\n'), 'warning')
      return
    }
    
    // 2. 测试音量获取
    try {
      const currentVolume = await window.electron?.ipcRenderer?.invoke('get-volume')
      diagnosticInfo.push(`✅ 获取音量: 成功 (当前: ${currentVolume}%)`)
    } catch (getError: any) {
      const getMsg = getError?.message || getError?.toString() || ''
      const getCode = getError?.code || ''
      diagnosticInfo.push(`❌ 获取音量: 失败`)
      diagnosticInfo.push(`   错误: ${getMsg.slice(0, 60)}${getCode ? ` (${getCode})` : ''}`)
    }
    
    // 3. 测试音量设置权限
    try {
      const originalVolume = await window.electron?.ipcRenderer?.invoke('get-volume')
      const testVol = originalVolume === 50 ? 51 : 50
      const setResult = await window.electron?.ipcRenderer?.invoke('set-volume', testVol)
      
      if (setResult) {
        // 恢复原音量
        await window.electron?.ipcRenderer?.invoke('set-volume', originalVolume)
        diagnosticInfo.push(`✅ 设置音量: 成功 (权限正常)`)
      } else {
        diagnosticInfo.push(`❌ 设置音量: 失败 (权限被拒绝)`)
      }
    } catch (setError: any) {
      const setMsg = setError?.message || setError?.toString() || ''
      const setCode = setError?.code || ''
      diagnosticInfo.push(`❌ 设置音量: 失败`)
      diagnosticInfo.push(`   错误: ${setMsg.slice(0, 60)}${setCode ? ` (${setCode})` : ''}`)
      
      // 分析错误类型
      if (setMsg.includes('permission') || setMsg.includes('access') || setCode === 'EACCES') {
        diagnosticInfo.push('   🔧 解决方案: 请右键以管理员身份运行应用')
      } else if (setMsg.includes('AUDCLNT')) {
        diagnosticInfo.push('   🔧 解决方案: 音频设备异常，请重启音频服务')
      } else if (setMsg.includes('COM')) {
        diagnosticInfo.push('   🔧 解决方案: COM组件异常，请重启应用')
      }
    }
    
    // 4. 检查系统信息
    diagnosticInfo.push('', '📋 系统信息:')
    diagnosticInfo.push(`   操作系统: ${navigator.platform}`)
    diagnosticInfo.push(`   用户代理: ${navigator.userAgent.slice(0, 80)}...`)
    
    // 5. 检查媒体设备权限
    if (navigator.mediaDevices) {
      try {
        const devices = await navigator.mediaDevices.enumerateDevices()
        const audioOutputs = devices.filter(d => d.kind === 'audiooutput')
        const audioInputs = devices.filter(d => d.kind === 'audioinput')
        diagnosticInfo.push(`   音频输出设备: ${audioOutputs.length} 个`)
        diagnosticInfo.push(`   音频输入设备: ${audioInputs.length} 个`)
      } catch (mediaError) {
        diagnosticInfo.push(`   媒体设备: 检查失败`)
      }
    }
    
    // 6. 添加建议
    diagnosticInfo.push('', '💡 故障排除建议:')
    diagnosticInfo.push('1. 确保以管理员身份运行应用')
    diagnosticInfo.push('2. 检查Windows Audio服务是否运行')
    diagnosticInfo.push('3. 重新插拔音频设备')
    diagnosticInfo.push('4. 更新音频驱动程序')
    diagnosticInfo.push('5. 重启应用或系统')
    
    console.log('诊断完成:', diagnosticInfo)
    window.messageRef?.show(diagnosticInfo.join('\n'), 'info')
    
  } catch (error: any) {
    console.error('系统诊断失败:', error)
    const errorMsg = error?.message || error?.toString() || ''
    window.messageRef?.show(`系统诊断失败: ${errorMsg}`, 'error')
  }
}

onMounted(async () => {
  await initTranslations()
})

defineExpose({ open, close, volume ,visible})
</script>

<style scoped>
.sound-mask {
  position: fixed;
  left: 0;
  top: 0;
  width: 100vw;
  height: 100vh;
  z-index: 3000;
}
.sound-panel {
position: absolute;
bottom: 60px;
right: 10px;
  min-width: 320px;
  padding: 18px 24px 24px 24px;
  background: #fff;
  border-radius: 16px;
  box-shadow: 0 8px 32px rgba(30,94,146,0.18), 0 2px 8px rgba(0,0,0,0.12);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
.sound-title {
  font-size: 20px;
  color: #222;
  margin-bottom: 18px;
}
.sound-slider-row {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 18px;
}
.sound-slider {
  flex: 1;
  accent-color: #1e5e92;
  height: 4px;
}
.sound-value {
  font-size: 20px;
  color: #222;
  min-width: 36px;
  text-align: right;
  transition: color 0.2s ease;
}

.sound-value.setting {
  color: #1e5e92;
  font-weight: 600;
}

.sound-slider:disabled {
  opacity: 0.7;
  cursor: not-allowed;
}

.sound-test-row {
  width: 100%;
  display: flex;
  gap: 12px;
  margin-top: 16px;
}

.sound-test-btn {
  flex: 1;
  padding: 8px 16px;
  background: #1e5e92;
  color: white;
  border: none;
  border-radius: 6px;
  font-size: 14px;
  cursor: pointer;
  transition: background 0.2s;
}

.sound-test-btn:hover {
  background: #158ac0;
}

.sound-info-row {
  width: 100%;
  margin-top: 12px;
}

.sound-diagnose-btn {
  width: 100%;
  padding: 8px 16px;
  background: #f5f5f5;
  color: #666;
  border: 1px solid #ddd;
  border-radius: 6px;
  font-size: 14px;
  cursor: pointer;
  transition: all 0.2s;
}

.sound-diagnose-btn:hover:not(:disabled) {
  background: #e8e8e8;
  border-color: #ccc;
  color: #444;
}

.sound-diagnose-btn:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}
</style>
